Skip to content

S01-05 Servlet-路径 ​

[TOC]

JavaWeb 工程路径指在 Web 容器(如 Tomcat)运行环境中,定位页面、静态资源(CSS/JS/图片)、Servlet 及配置文件的寻址规则。解析路径的核心在于明确解析执行方是浏览器还是服务器。

路径本质与工程结构 ​

Web 工程在容器中部署后,虚拟路径与物理磁盘路径存在映射关系。

  • Web 根目录(WebContent / webapp):对外公开的根目录,包含静态资源、首页 index.jsp 等。映射为应用的上下文路径(Context Path)。
  • WEB-INF 目录:受保护目录,客户端浏览器无法通过 URL 直接访问,仅允许服务端内部转发访问。
  • URL 映射关系:访问地址 http://localhost:8080/工程名/资源路径 中,/工程名 对应 WebContent 目录本身。

相对路径 ​

相对路径不以斜杠 / 开头,其寻址完全基于浏览器当前地址栏中的 URL 进行计算推导。

寻址规则 ​

  • ./ 或直接写资源名:基于当前目录寻址。
  • ../:回退到上一级目录寻址。

转发陷阱 ​

当服务端执行转发时,浏览器地址栏的 URL 保持不变,但页面实际所在的层级已经改变。若页面内使用相对路径引用资源,会导致浏览器以错误的基准路径发起请求,产生 404 错误。

java
// 请求转发后浏览器地址栏不变,会导致页面内的相对路径基准发生偏移
request.getRequestDispatcher("/views/detail.jsp").forward(request, response);

客户端绝对路径 ​

所有交由浏览器解析的路径均属于客户端路径,包括 HTML 标签属性(href、src、action)、CSS 中的 url()、JavaScript 中的跳转以及服务端的重定向 sendRedirect()。

斜杠含义 ​

客户端路径中的首个斜杠 / 被浏览器解析为服务器主机根目录:

text
/ 映射为:http://localhost:8080/

编写规范 ​

必须显式包含工程上下文路径(Context Path),否则请求会跨越到工程外部。

场景错误写法(404)正确写法
表单提交<form action="/login"><form action="/工程名/login">
静态资源<img src="/img/logo.png"><img src="/工程名/img/logo.png">
重定向response.sendRedirect("/index.jsp")见下方代码示例
java
// 客户端重定向由浏览器发起新请求,必须手动拼装工程路径
String contextPath = request.getContextPath();
response.sendRedirect(contextPath + "/login.jsp");

服务端绝对路径 ​

所有交由Web 容器(服务器)解析的路径属于服务端路径,包括 request.getRequestDispatcher()、ServletContext 获取资源、web.xml 中的 <url-pattern> 以及注解 @WebServlet。

斜杠含义 ​

服务端路径中的首个斜杠 / 被容器解析为当前 Web 应用的根目录:

text
/ 映射为:http://localhost:8080/工程名/

编写规范 ​

严禁拼接工程名。若多写了工程名,服务器会将其识别为工程内部的一个子目录。

java
// 服务端跳转由容器直接解析为工程根目录,不可拼接工程名
request.getRequestDispatcher("/pages/user.jsp").forward(request, response);

统一路径方案 ​

硬编码工程名会导致项目重命名或部署为根上下文时大面积失效。实际开发中通常采用以下标准流程来消除路径硬编码:

  1. 动态获取工程路径:在 JSP 页面或模版中使用 EL 表达式 ${pageContext.request.contextPath} 动态输出上下文名称。

  2. 基准路径标签法:在 HTML 的 <head> 区域声明 <base> 标签,将整个页面的相对路径基准锚定在工程根目录下。

  3. 前台资源引用:所有超链接与资源加载均使用绝对路径拼接模式。

    jsp
    <%
      String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + request.getContextPath() + "/";
    %>
    <head>
      <base href="<%=basePath%>">
    </head>

物理与类路径 ​

在 Java 后台代码中读写磁盘文件或加载配置文件时,涉及物理路径与 Classpath 路径。

磁盘物理绝对路径 ​

Web 资源部署在磁盘上的真实存储位置,可通过 ServletContext 进行动态映射。

java
// 获取工程资源在宿主机磁盘上的绝对物理路径
String realPath = request.getServletContext().getRealPath("/upload");

类加载器路径 ​

读取 src 源码目录(编译后进入 WEB-INF/classes)下的配置文件时,必须脱离 Web 容器路径,使用类加载器读取。

java
// 类加载器从 classpath 根路径加载配置文件输入流
InputStream in = DbUtil.class.getClassLoader().getResourceAsStream("db.properties");